Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: 秋雨落   发起时间: 2008-11-09 20:57 下午   回复: 5

Print Search
帖子排序:    
   2008-11-09, 20:57 下午
qiuyuluo 离线,最后访问时间: 2008/11/12 20:23:58 秋雨落

发帖数前200位
注册: 2008-11-03
发 贴: 4
请问大家一个关于int 2d的问题
Reply Quote
我在看雪论坛上看到,说用户态调用int 2dh,如果没有调试器就会返回异常,如果有调试器,那就不会返回异常。这个是什么个流程呢?
我在DBGPrint过程中也看到了一直调用到int 2dh,后面就是KiDebugService,然后CommonDispatchException,然后再到KiDispatchException,再到KdpStub或者KdpTrap,可是我怎么也没发现什么时候判断调试器的。

IP 地址: 已记录   报告
   2008-11-09, 23:41 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问大家一个关于int 2d的问题
Reply Quote

这里要区分CPU级的异常,还是软件层次的异常。CPU执行INT 2D时总是会产生异常(TRAP)。操作系统也总会收到和分发这个异常。按照异常分配的原则,有人处理了就不会继续分发,所以如果是内核调试例程声明处理了这个异常,那么用户态的代码就不会收到[软件]异常了。

有否调试器的差异就是调用KdpStub(没有调试器)还是KdpTrap(有调试器),分发异常时不需要做判断,因为调试器函数已经把函数指针(KiDebugRoutine)的指向设置好了。


IP 地址: 已记录   报告
   2008-11-10, 00:01 上午
qiuyuluo 离线,最后访问时间: 2008/11/12 20:23:58 秋雨落

发帖数前200位
注册: 2008-11-03
发 贴: 4
Re: 请问大家一个关于int 2d的问题
Reply Quote
就是说用户态调试器如vc调试器或ollydbg也是KdpTrap?
IP 地址: 已记录   报告
   2008-11-10, 03:27 上午
qiuyuluo 离线,最后访问时间: 2008/11/12 20:23:58 秋雨落

发帖数前200位
注册: 2008-11-03
发 贴: 4
Re: 请问大家一个关于int 2d的问题
Reply Quote
我查到的reactos中用户态异常处理的代码:
if (FirstChance)
{
/* Make sure a debugger is present, and ignore user-mode if requested */
if ((KiDebugRoutine) &&
(!(PsGetCurrentProcess()->DebugPort)))
{
/* Call the debugger */
if (KiDebugRoutine(TrapFrame,
ExceptionFrame,
ExceptionRecord,
&Context,
PreviousMode,
FALSE))
{
/* Exception was handled */
goto Handled;
}
}

/* Forward exception to user mode debugger */
if (DbgkForwardException(ExceptionRecord, TRUE, FALSE)) goto Exit;

这儿先是判断 if ((KiDebugRoutine) &&
(!(PsGetCurrentProcess()->DebugPort)))
就是说DebugPort不为零的话,那么调用KiDebugRoutine,
否则就直接DbgkForwardException发往调试器。

IP 地址: 已记录   报告
   2008-11-10, 08:47 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问大家一个关于int 2d的问题
Reply Quote

 qiuyuluo wrote:
就是说DebugPort不为零的话,那么调用KiDebugRoutine,否则就直接DbgkForwardException发往调试器。

应该为“就是说DebugPort为零的话.......”为零代表没有用户态调试器。

 


IP 地址: 已记录   报告
   2008-11-10, 08:52 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问大家一个关于int 2d的问题
Reply Quote

 qiuyuluo wrote:
就是说用户态调试器如vc调试器或ollydbg也是KdpTrap?

KdpTrap是内核调试引擎(KD)的接口函数,是用来做内核态调试的,它与用户态的调试器没有必然关系。用户态调试器是不需要关心下面是不是启用了内核调试的。

如果你有《软件调试》,那么先看一下第3篇的篇扉,然后仔细读一下第9、10章(用户态调试)和第18章(内核态调试)。它们是两套"系统"。


IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » 请问大家一个关于int 2d的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.